package edu.ynu.se.xiecheng.achitectureclass.common.service;

import edu.ynu.se.xiecheng.achitectureclass.common.dao.ImageDataDao;
import edu.ynu.se.xiecheng.achitectureclass.common.utils.TokenUtil2;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

/**
 * 服务层类，用于处理图片数据的业务逻辑
 *
 * **设计模式：**
 * - **服务模式 (Service Layer Pattern)**：
 *   提供与图片数据相关的业务逻辑处理。
 *
 * **设计原则：**
 * - **单一职责原则 (SRP)**：
 *   该类专注于图片数据的业务逻辑。
 * - **依赖注入原则 (DIP)**：
 *   通过构造函数注入 DAO 依赖。
 */
@Service
public class ImageDataService {

    // 图片数据 DAO 对象
    private final ImageDataDao imageDataDao;

    /**
     * 构造函数，注入 DAO 依赖
     *
     * @param imageDataDao 自动注入的 ImageDataDao 对象
     */
    public ImageDataService(ImageDataDao imageDataDao) {
        this.imageDataDao = imageDataDao;
    }

    /**
     * 调用 API 获取图片 URL
     *
     * **设计模式：**
     * - **模板方法模式 (Template Method Pattern)**：
     *   使用 `RestTemplate` 调用外部 API。
     *
     * @return 从 API 返回的图片 URL
     */
    public String callApiAndFetchPicUrl() {
        // 使用工具类获取访问令牌
        String token = TokenUtil2.fetchToken();

        String apiUrl = "https://open.ys7.com/api/lapp/device/capture";

        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        // 构造请求体
        String requestBody = "accessToken=" + token +
                "&deviceSerial=AB9831171" +
                "&channelNo=1" +
                "&quality=4";

        try {
            // 调用 API
            RestTemplate restTemplate = new RestTemplate();
            HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
            ResponseEntity<Map> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, Map.class);

            // 处理响应数据
            if (response.getStatusCode() == HttpStatus.OK) {
                Map<String, Object> responseBody = response.getBody();
                if (responseBody != null && responseBody.get("data") instanceof Map) {
                    Map<String, Object> data = (Map<String, Object>) responseBody.get("data");
                    return (String) data.get("picUrl");
                } else {
                    throw new RuntimeException("Invalid response format");
                }
            } else {
                throw new RuntimeException("Failed to call API. Status code: " + response.getStatusCode());
            }
        } catch (Exception e) {
            throw new RuntimeException("Failed to call API.", e);
        }
    }

    /**
     * 保存图片 URL 到数据库
     *
     * @param picUrl 图片的 URL
     */
    public void savePicUrl(String picUrl) {
        imageDataDao.savePicUrlToDatabase(picUrl);
    }
}
